
import 'dart:collection';

/**
 * 作用域
 * 用来限定标识符的可见性。
 */

class Scope{

  //以名称为key存储符号
  LinkedHashMap<String,Symbol> name2sym =  LinkedHashMap<String,Symbol>();

  //上级作用域
  Scope? enclosingScope;
  Scope(this.enclosingScope);
  /// 把符号记入符号表（作用域）
  /// @param name
  /// @param sym
  void enter(String name, Symbol sym){
      name2sym[name]=sym;
  }
  /// 查询是否有某名称的符号
  /// @param name
  bool hasSymbol(String name){
    return name2sym.containsKey(name);
  }
  /// 根据名称查找符号。
  /// @param name 符号名称。
  /// @returns 根据名称查到的Symbol。如果没有查到，则返回null。
  Symbol? getSymbol(String name){
        if(hasSymbol(name)){
          return name2sym[name];
        }
        return null;
  }
/// 级联查找某个符号。
/// 先从本作用域查找，查不到就去上一级作用域，依此类推。
/// @param name
  Symbol? getSymbolCascade(String name){
      var sym = getSymbol(name);
      if( sym != null){
        return sym;
      }
      else if(enclosingScope != null){
        return enclosingScope!.getSymbolCascade(name);
      }else{
        return null;
      }
  }
}